package org.edu.modules.oa.controller;

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.PutObjectResult;
import groovy.util.logging.Slf4j;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import lombok.var;
import org.apache.catalina.security.SecurityUtil;
import org.apache.poi.ss.formula.functions.T;
import org.apache.shiro.SecurityUtils;
import org.edu.common.api.vo.Result;
import org.edu.common.aspect.annotation.AutoLog;
import org.edu.common.system.vo.LoginUser;
import org.edu.common.util.RedisUtil;
import org.edu.modules.oa.entity.SysDictItemEntity;
import org.edu.modules.oa.entity.VeOaTongxunluEntity;
import org.edu.modules.oa.service.IVeOaTongxunluService;
import org.edu.modules.oa.util.OssDownloadUtil;
import org.edu.modules.oa.vo.VeOaTongxunluVo;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartRequest;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.mail.Multipart;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.security.Security;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Api(tags="个人通讯录")
@RestController
@RequestMapping("oa/VeOaPersonTongxunlu")
@Slf4j
public class VeOaPersonTongxunluController {

    @Autowired
    private RedisUtil redisUtil; // redis服务类
    @Resource
    private IVeOaTongxunluService iVeOaTongxunluService;
    @Resource
    private OSS ossClient;

    //日志注解
    @AutoLog(value = "个人通讯录-显示表格")
    @ApiOperation(value = "显示表格",notes = "个人通讯录-显示表格")
    //显示表格  查询（个人通讯录）
    @PostMapping(value = "/searchTable")
    public Result<?> showTable(Integer startPage, Integer pageSize, VeOaTongxunluEntity veOaTongxunluEntity){
        //获取登录人信息
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        veOaTongxunluEntity.setCreateBy(user.getId());
        HashMap<String,Object> map = iVeOaTongxunluService.selectTongxunlu(veOaTongxunluEntity,startPage,pageSize);
        return Result.OK(map);
    }

    @AutoLog(value = "个人通讯录-添加数据")
    @ApiOperation(value = "查看职务表格", notes = "个人通讯录-查看职务表格")
    @PostMapping(value = "/selectWorkTable")
    //显示职务表格  查看职务
    public Result<?> selectWorkTable(SysDictItemEntity sysDictItemEntity){
        System.out.println(sysDictItemEntity.getItemText());
        sysDictItemEntity.setDictId("1174509082208395266");
        HashMap<String,Object> map = iVeOaTongxunluService.selectJob(sysDictItemEntity);
        return Result.OK(map);
    }

    //新增个人通讯录
    @AutoLog(value = "个人通讯录-添加数据")
    @ApiOperation(value = "添加数据", notes = "个人通讯录-添加数据")
    @PostMapping(value = "/addPersonTongxunlu")
    public Result<?> addPersonTongxunlu(VeOaTongxunluEntity veOaTongxunluEntity,String addDate) throws ParseException {
        //前端传过来的时间字符串转换成日期
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date birthdaychanged = null;
        birthdaychanged = formatter.parse(addDate.trim());
        veOaTongxunluEntity.setBirthday(birthdaychanged);
        //获取登录人信息
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        veOaTongxunluEntity.setCreateBy(user.getId());
        veOaTongxunluEntity.setTerminalId(1);//终端id
        //删除状态 0 未删除
        veOaTongxunluEntity.setIsDeleted(0);
        int res = iVeOaTongxunluService.addPersonTongxunlu(veOaTongxunluEntity);
        if (res == 0){
            return Result.error(500,"添加失败");
        }
        return Result.OK();
    }

    @AutoLog(value = "个人通讯录-删除单条个人通讯录数据")
    @ApiOperation(value = "删除单条个人通讯录数据", notes = "个人通讯录-删除单条个人通讯录数据")
    @PostMapping(value = "/deleteSingle")
    //删除单条个人通讯录数据
    public Result<?> deleteSingle(Long singleId){
        List<Long> list = new ArrayList<>();
        list.add(singleId);
        int res = iVeOaTongxunluService.deletePersonTongxunlu(list);
        if(res==0){
            //删除失败
            return Result.error(500,"删除失败");
        }
        return Result.OK("删除成功");

    }

    @AutoLog(value = "个人通讯录-删除多条个人通讯录数据")
    @ApiOperation(value = "删除多条个人通讯录数据", notes = "个人通讯录-删除多条个人通讯录数据")
    @GetMapping(value = "/deleteAll")
    //删除多条个人通讯录数据
    public Result<?> deleteAll(@RequestParam List<String> ids){
        System.out.println("数组"+ids);
        List<Long> list = new ArrayList<>();
        for (int i=0;i<ids.size();i++){
            System.out.println(ids.get(i));
            list.add(Long.parseLong(ids.get(i)));
        }
        int res = iVeOaTongxunluService.deletePersonTongxunlu(list);
        if(res==0){
            //删除失败
            return Result.error(500,"删除失败");
        }
        return Result.OK("删除成功");
    }



    //修改个人通讯录
    @AutoLog(value = "个人通讯录-修改个人通讯录数据")
    @ApiOperation(value = "修改个人通讯录数据", notes = "个人通讯录-修改个人通讯录数据")
    @PostMapping(value = "/updateTongxunlu")
    public Result<?> updateTongxunlu(VeOaTongxunluEntity veOaTongxunluEntity,String updateDate) throws ParseException {
        //前端传过来的时间字符串转换成日期
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date birthdaychanged = null;
        birthdaychanged = formatter.parse(updateDate.trim());
        veOaTongxunluEntity.setBirthday(birthdaychanged);
        int res = iVeOaTongxunluService.updatePersonTongxunlu(veOaTongxunluEntity);
        if (res == 0){
            return Result.error(500,"添加失败");
        }
        return Result.OK();
    }


    //多个导出
    @AutoLog(value = "个人通讯录-单个导出excel表格")
    @ApiOperation(value = "单个导出excel表格", notes = "个人通讯录-单个导出excel表格")
    @GetMapping(value = "/exportTongxunluTableOne")
    //ModelAndView 导出表格流
    public ModelAndView exportTongxunluTableOne(){
        VeOaTongxunluEntity veOaTongxunluEntity = new VeOaTongxunluEntity();
        //获取登录人信息
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        veOaTongxunluEntity.setCreateBy(user.getId());
        //查个人的全部通讯录
        List<VeOaTongxunluVo> voList = iVeOaTongxunluService.export(veOaTongxunluEntity);
        //创建导出流
        ModelAndView modelAndView = new ModelAndView(new JeecgEntityExcelView());
        //文件的文件名
        modelAndView.addObject(NormalExcelConstants.FILE_NAME,"个人通讯录");
        //数据的类型
        modelAndView.addObject(NormalExcelConstants.CLASS,VeOaTongxunluVo.class);
        // ExportParams  Export工具类   （参数1--》title:表格标题  参数2--》secomdTitle:第二行的标题，  参数3--》secomdTitle:最下面尾部的信息）
        ExportParams exportParams = new ExportParams("个人通讯录","导出人:"+user.getRealname(),"导出个人通讯录信息");
        modelAndView.addObject(NormalExcelConstants.PARAMS,exportParams);
        modelAndView.addObject(NormalExcelConstants.DATA_LIST,voList);

        return modelAndView;
    }


    //导入
    @AutoLog(value = "个人通讯录-导入")
    @ApiOperation(value = "导入", notes = "个人通讯录-导入")
    @PostMapping(value = "/importTongxunluExcel")
    public Result<?> importTongxunluExcel(HttpServletRequest req, HttpServletResponse resp){

        //先把需要导入的文件上传
        MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) req;
        //获取上传的文件
        Map<String, MultipartFile> fileMap = multipartHttpServletRequest.getFileMap();
        //校验文件类型
        for (Map.Entry<String,MultipartFile> entry : fileMap.entrySet()){
            MultipartFile file = entry.getValue();
            if(file != null){
                String fileName = null;
                String suffixName = null;
                //获取文件名
                fileName = file.getOriginalFilename();
                //用点来切割获取文件类型注意//.需要加双斜杠正则表达式
                String[] arr = fileName.split("\\.");
                //获取文件后缀名
                suffixName = arr[arr.length-1];
                if(!suffixName.equals("xls") && !suffixName.equals("xlsx")){
                    return Result.error(400,"文件导入格式须为电子表格");
                }
            }

        }
        //获取上传文件模板对象
        /*for (Map.Entry<String,MultipartFile> entry : fileMap.entrySet()){

            MultipartFile file = entry.getValue();
            if(file != null){
                //创建文件类
                String fileName = null;
                String suffixName = null;
                File document = null;
                //获取文件名
                fileName = file.getOriginalFilename();
                //用点来切割获取文件类型注意//.需要加双斜杠正则表达式
                String[] arr = fileName.split("\\.");
                //获取文件后缀名
                //获取文件后缀名
                suffixName = arr[arr.length-1];
                if(!suffixName.equals("xls") && !suffixName.equals("xlsx")){
                    return Result.error(400,"文件类型不能上传");
                }

                try {
                    String originalFilename = file.getOriginalFilename();
                    String[] filename = originalFilename.split("\\.");
                    document=File.createTempFile(filename[0], filename[1]);
                    file.transferTo(document);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                //获取文件长度
                Long size = file.getSize();
                //获取唯一的文件名称
                String docName = UUID.randomUUID().toString()+"."+suffixName;
                //上传文件到指定的存储空间  第一个参数 bucketName  第二个参数 OSS存储路径  第三个参数 要上传的文件
                PutObjectResult result = ossClient.putObject("digital-school-xx0422","oa-car-ImportModel/"+docName,document);
                System.out.println("-------上传到oss结果-----------|"+result);
                //文件下载地址
                String path = "https://digital-school-xx0422.oss-cn-shenzhen.aliyuncs.com/oa-car-ImportModel/"+docName;
                System.out.println("-------文件下载地址-----------|"+path);
                break;
            }

        }*/

        //取出来
        for (Map.Entry<String,MultipartFile> entry : fileMap.entrySet()){
            //获取上传文件对象
            MultipartFile file = entry.getValue();
            ImportParams params = new ImportParams();
            params.setTitleRows(2);
            params.setHeadRows(1);
            params.setNeedSave(true);
            List<VeOaTongxunluVo> voList = null;
            try {
                //上传的数据的集合（volist就是文件里所有内容）
                voList = ExcelImportUtil.importExcel(file.getInputStream(), VeOaTongxunluVo.class,params);
                System.out.println("===="+voList.size()+"======");
                //获取redis存的用户值
                LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
                //加入数据库使用的集合
                List<VeOaTongxunluEntity> entityList = new ArrayList<>();
                //循环遍历把需要的字段拷贝到数据库插入的集合中
                int count = 0;
                for (VeOaTongxunluVo vo : voList){
                    System.out.println("==========================");
                    System.out.println(vo);
                    System.out.println("==========================");
                    VeOaTongxunluEntity veOaTongxunluEntity = new VeOaTongxunluEntity();
                    //判断非空
                    if (vo.getUserName() == null || vo.getUserName().equals("")){
                        return Result.error(500,"联系人空缺，请补充");
                    }
                    System.out.println("性别："+vo.getSex());
                    System.out.println("共享："+vo.getIsShare());
                    if (!"男".equals(vo.getSex()) && !"女".equals(vo.getSex()) ){
                        return Result.error(500,"性别输入有误或空缺");
                    }
                    if (!vo.getIsShare().equals(("是").trim()) && !vo.getIsShare().equals(("否").trim())){
                        return Result.error(500,"共享信息输入有误或空缺");
                    }

                    //姓名
                    veOaTongxunluEntity.setUserName(vo.getUserName());
                    //性别
                    if (vo.getSex().equals(("男").trim())){
                        veOaTongxunluEntity.setSex(0);
                    }else {
                        veOaTongxunluEntity.setSex(1);
                    }
                    //生日
                    //字符串转换成时间类型
                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                    Date birthday = formatter.parse(vo.getBirthday());
                    veOaTongxunluEntity.setBirthday(birthday);
                    //职位
                    veOaTongxunluEntity.setJob(vo.getJob());
                    //单位名称
                    veOaTongxunluEntity.setUnitName(vo.getUnitName());
                    //单位电话
                    veOaTongxunluEntity.setUnitPhone(vo.getUnitPhone());
                    //家庭电话
                    veOaTongxunluEntity.setHomePhone(vo.getHomePhone());
                    //手机
                    veOaTongxunluEntity.setPhone(vo.getPhone());
                    //电子邮件
                    veOaTongxunluEntity.setEmail(vo.getEmail());
                    //qq
                    veOaTongxunluEntity.setQq(vo.getQq());
                    //是否共享
                    if (vo.getIsShare().equals(("是").trim())){
                        veOaTongxunluEntity.setIsShare(0);
                    }else {
                        veOaTongxunluEntity.setIsShare(1);
                    }
                    veOaTongxunluEntity.setCreateBy(user.getId());
                    veOaTongxunluEntity.setTerminalId(1);
                    veOaTongxunluEntity.setIsDeleted(0);

                    entityList.add(veOaTongxunluEntity);
                    count++;
                }

                iVeOaTongxunluService.saveBatch(entityList);
                return Result.ok("个人通讯录导入成功！数据行数：" + count);
            } catch (Exception e) {
                e.printStackTrace();
                return Result.error("文件导入失败，请检查数据格式");
            }finally {
                try {
                    file.getInputStream().close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }

        return Result.error("文件类型不支持，导入失败，请参照模板");
    }


    //导出excel模板
    @AutoLog(value = "导出excel模板")
    @ApiOperation(value = "导出excel模板",notes = "个人通讯录-导出excel模板")
    @GetMapping(value = "/exportModel")
    public ModelAndView exportModel(){
        //创建导出流
        ModelAndView modelAndView = new ModelAndView(new JeecgEntityExcelView());
        //文件的文件名
        modelAndView.addObject(NormalExcelConstants.FILE_NAME,"个人通讯录");
        modelAndView.addObject(NormalExcelConstants.CLASS,VeOaTongxunluVo.class);
        //获取redis存的用户值
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        // ExportParams  Export工具类   （参数1--》title:表格标题  参数2--》secomdTitle:第二行的标题，  参数3--》secomdTitle:最下面尾部的信息）
        ExportParams exportParams = new ExportParams("个人通讯录","导出人:"+user.getRealname(),"导出个人通讯录信息");
        modelAndView.addObject(NormalExcelConstants.PARAMS,exportParams);
        modelAndView.addObject(NormalExcelConstants.DATA_LIST,new ArrayList<VeOaTongxunluVo>());

        return modelAndView;
    }

    @AutoLog(value = "车辆保险业务-模板地址获取")
    @ApiOperation(value = "模板地址", notes = "车辆保险业务-模板地址获取")
    @PostMapping(value = "/getUrl")
    public Result<T> getUrl() throws Exception {
        Result result = new Result();
        String url= OssDownloadUtil.getOssDownloadUtil().downFileFromOSS("个人通讯录模板.xls");
        result.success(url);
        return result;
    }

}
